package com.qianbao.qianbaobusiness.ui.cashier.databill;

import android.content.Context;
import android.support.v7.widget.RecyclerView;

import java.util.Collections;
import java.util.List;


/**
 * Created by jiangyu on 15/9/30.
 */
public abstract class BaseRecyclerViewAdapter<M, VH extends RecyclerView.ViewHolder> extends RecyclerView
        .Adapter<VH> {

    protected int mItemLayoutId;
    public Context mContext;
    protected List<M> mDatas;
    protected RecyclerView mRecyclerView;
    private OnRecyclerViewItemClickListener mListener;
    private OnRecyclerViewItemLongClickListener mLongClickListener;
    protected int offset = 0;

    public BaseRecyclerViewAdapter(Context context, List<M> mList) {
//        recyclerView = recyclerView;
//        mContext = recyclerView.getContext();
//        this.mItemLayoutId = mItemLayoutId;
        mContext = context;
        mDatas=mList;
    }

    public BaseRecyclerViewAdapter(RecyclerView recyclerView, int mItemLayoutId, List<M> mList) {
        mRecyclerView = recyclerView;
        mContext = mRecyclerView.getContext();
        this.mItemLayoutId = mItemLayoutId;
        mDatas = mList;
    }

//    @Override
//    public VH onCreateViewHolder(ViewGroup parent, int viewType) {
//        BaseViewHolder viewHolder = new BaseViewHolder(recyclerView, LayoutInflater.from(mContext).inflate(mItemLayoutId, parent, false), this);
//        return (VH) viewHolder;
//    }
//
//    public void onBindViewHolder(VH holder, int position, int offset) {
//        bindView(holder, position, getItem(position - offset));
//    }

    @Override
    public void onBindViewHolder(VH holder, int position) {
        if(position < offset) {
            bindView(holder, position, null);
        } else {
            bindView(holder, position, getItem(position - offset));
        }
    }

    /**
     * 填充item数据
     *
     * @param position
     * @param model
     */
    protected abstract void bindView(VH holder, int position, M model);

    /**
     * 设置Item点击监听
     *
     * @param listener
     */
    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
        this.mListener = listener;
    }

    public void setOnItemLongClickListener(OnRecyclerViewItemLongClickListener listener) {
        this.mLongClickListener = listener;
    }

    public OnRecyclerViewItemClickListener getClickListener() {
        return mListener;
    }

    public OnRecyclerViewItemLongClickListener getLongClickListener() {
        return mLongClickListener;
    }

    @Override
    public int getItemCount() {
        return mDatas == null ? 0 : mDatas.size();
    }

    public M getItem(int position) {
        if(mDatas == null || position < 0 || position >= mDatas.size()) {
            return null;
        }
        return mDatas.get(position);
    }

    /**
     * 获取数据集合
     *
     * @return
     */
    public List<M> getDatas() {
        return mDatas;
    }

    public int getSize() {
        return mDatas == null ? 0 : mDatas.size();
    }

    /**
     * 设置全新的数据集合，如果传入null，则清空数据列表（第一次从服务器加载数据，或者下拉刷新当前界面数据表）
     *
     * @param datas
     */
    public void setDatas(List<M> datas) {
        if (datas != null) {
            mDatas = datas;
        } else {
            mDatas.clear();
        }
        notifyDataSetChanged();
    }

    /**
     * 在集合头部添加新的数据集合（下拉从服务器获取最新的数据集合，例如新浪微博加载最新的几条微博数据）
     *
     * @param datas
     */
    public void addNewDatas(List<M> datas) {
        if (datas != null) {
            mDatas.addAll(0, datas);
            notifyItemRangeInserted(0, datas.size());
        }
    }

    /**
     * 在集合尾部添加更多数据集合（上拉从服务器获取更多的数据集合，例如新浪微博列表上拉加载更晚时间发布的微博数据）
     *
     * @param datas
     */
    public void addMoreDatas(List<M> datas) {
        if (datas != null) {
            mDatas.addAll(mDatas.size(), datas);
            notifyItemRangeInserted(mDatas.size(), datas.size());
        }
    }

    /**
     * 清空数据列表
     */
    public void clear() {
        mDatas.clear();
        notifyDataSetChanged();
    }

    /**
     * 删除指定索引数据条目
     *
     * @param position
     */
    public void removeItem(int position) {
        mDatas.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, getItemCount());
    }

    /**
     * 删除指定数据条目
     *
     * @param model
     */
    public void removeItem(M model) {
        removeItem(mDatas.indexOf(model));
    }

    /**
     * 在指定位置添加数据条目
     *
     * @param position
     * @param model
     */
    public void addItem(int position, M model) {
        mDatas.add(position, model);
        notifyItemInserted(position);
        notifyItemRangeChanged(position, getItemCount());
    }

    /**
     * 在集合头部添加数据条目
     *
     * @param model
     */
    public void addFirstItem(M model) {
        addItem(0, model);
    }

    /**
     * 在集合末尾添加数据条目
     *
     * @param model
     */
    public void addLastItem(M model) {
        addItem(mDatas.size(), model);
    }

    /**
     * 替换指定索引的数据条目
     *
     * @param location
     * @param newModel
     */
    public void setItem(int location, M newModel) {
        mDatas.set(location, newModel);
        notifyItemChanged(location);
    }

    /**
     * 替换指定数据条目
     *
     * @param oldModel
     * @param newModel
     */
    public void setItem(M oldModel, M newModel) {
        setItem(mDatas.indexOf(oldModel), newModel);
    }

    /**
     * 交换两个数据条目的位置
     *
     * @param fromPosition
     * @param toPosition
     */
    public void moveItem(int fromPosition, int toPosition) {
        Collections.swap(mDatas, fromPosition, toPosition);
        notifyItemMoved(fromPosition, toPosition);
    }

    protected void setOffset(int offset) {
        this.offset = offset;
    }

    protected int getOffset() {
        return this.offset;
    }
}
